/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package service;

import java.util.Collection;
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Produces;
import javax.ws.rs.Consumes;
import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.persistence.EntityManager;
import jpa.entities.Usuario;
import jpa.entities.UsuarioAdm;
import jpa.entities.Pedido;
import jpa.entities.UsuarioCli;
import converter.UsuarioesConverter;
import converter.UsuarioConverter;
import javax.persistence.PersistenceContext;
import javax.ejb.Stateless;

/**
 *
 * @author carlos
 */

@Path("/usuarioes/")
@Stateless
public class UsuarioesResource {
    @javax.ejb.EJB
    private UsuarioResource usuarioResource;
    @Context
    protected UriInfo uriInfo;
    @PersistenceContext(unitName = "LaCruz_v2PU")
    protected EntityManager em;
  
    /** Creates a new instance of UsuarioesResource */
    public UsuarioesResource() {
    }

    /**
     * Get method for retrieving a collection of Usuario instance in XML format.
     *
     * @return an instance of UsuarioesConverter
     */
    @GET
    @Produces({"application/xml", "application/json"})
    public UsuarioesConverter get(@QueryParam("start")
                                  @DefaultValue("0")
    int start, @QueryParam("max")
               @DefaultValue("10")
    int max, @QueryParam("expandLevel")
             @DefaultValue("1")
    int expandLevel, @QueryParam("query")
                     @DefaultValue("SELECT e FROM Usuario e")
    String query) {
        return new UsuarioesConverter(getEntities(start, max, query), uriInfo.getAbsolutePath(), expandLevel);
    }

    /**
     * Post method for creating an instance of Usuario using XML as the input format.
     *
     * @param data an UsuarioConverter entity that is deserialized from an XML stream
     * @return an instance of UsuarioConverter
     */
    @POST
    @Consumes({"application/xml", "application/json"})
    public Response post(UsuarioConverter data) {
        Usuario entity = data.resolveEntity(em);
        createEntity(data.resolveEntity(em));
        return Response.created(uriInfo.getAbsolutePath().resolve(entity.getIdUsuario() + "/")).build();
    }

    /**
     * Returns a dynamic instance of UsuarioResource used for entity navigation.
     *
     * @return an instance of UsuarioResource
     */
    @Path("{idUsuario}/")
    public UsuarioResource getUsuarioResource(@PathParam("idUsuario")
    Integer id) {
        usuarioResource.setId(id);
        usuarioResource.setEm(em);
        return usuarioResource;
    }

    /**
     * Returns all the entities associated with this resource.
     *
     * @return a collection of Usuario instances
     */
    protected Collection<Usuario> getEntities(int start, int max, String query) {
        return em.createQuery(query).setFirstResult(start).setMaxResults(max).getResultList();
    }

    /**
     * Persist the given entity.
     *
     * @param entity the entity to persist
     */
    protected void createEntity(Usuario entity) {
        entity.setIdUsuario(null);
        em.persist(entity);
        for (UsuarioCli value : entity.getUsuarioCliCollection()) {
            Usuario oldEntity = value.getUsuario();
            value.setUsuario(entity);
            if (oldEntity != null) {
                oldEntity.getUsuarioCliCollection().remove(value);
            }
        }
        for (Pedido value : entity.getPedidoCollection()) {
            Usuario oldEntity = value.getUsuario();
            value.setUsuario(entity);
            if (oldEntity != null) {
                oldEntity.getPedidoCollection().remove(value);
            }
        }
        for (UsuarioAdm value : entity.getUsuarioAdmCollection()) {
            Usuario oldEntity = value.getUsuario();
            value.setUsuario(entity);
            if (oldEntity != null) {
                oldEntity.getUsuarioAdmCollection().remove(value);
            }
        }
    }
}
